【精选】【TCL语言

您所在的位置:网站首页 提取负数 括号 【精选】【TCL语言

【精选】【TCL语言

2023-11-16 09:51| 来源: 网络整理| 查看: 265

【TCL-高级正则表达式】

正则表达式是一个包含搜索模式的字符串,用于匹配其他的字符串。 Tcl正则表达式是基于1003.2规范和一些Perl5扩展。 Tcl正则表达式是包含一个或多个约束或量化原子连接而成。 正则表达式由POSIX定义,有两种风格:扩展正则(ERE)和基本正则(BRE)。 ERE与传统的egrep大致相同,BRE与传统的ed大致相同。 Tcl实现另一种风格:高级正则(ARE),在ERE的基础上添加一些重要的扩展。

BRE与ERE在几个方面有所不同。

1.在BRE中字符“|”、“+”和“?”只是普通字符,没有与它们的功能等价的字符。 2.边界的分隔符是“\{”和“\}”,“{”和“}”本身为普通的字符。 3.嵌套子表达式的括号是“”和“”和“”,“(”和“)”本身为普通字符。 4.除了在正则表达式或圆括号子表达式的开头以外,“^”均为普通字符。除了在正则表达式或圆括号子表达式的末尾以外,“$”均为普通字符。 5.如果“*”出现在正则表达式或圆括号子表达式的开头(或者有一个前导字符^),则为普通字符。 6.只能使用个位数的反向引用。 7.“\”等价于“[[::]]”。 8.除以上转义外,没有其他任何转义。 正则表达式的语法 regexp ?optionalSwitches ? patterns ?searchString ?fullMatch subMatch1 ... subMatchn

regexp ? switches ? exp str ?matchVar ? ?subMatchVar subMatchVar ...? 这里,正则表达式是命令。 我们将看到有关可选开关后。 模式: 是如前面提到的规则。 搜索字符串: 是其进行的正则表达式的实际字符串。 精确匹配任何可变持有的正则表达式匹配结果的结果。 Submatch1到SubMatchn:是持有次级匹配模式的结果可选的子变量。

在深入复杂的之前,让我们来看看一些简单的例子。一个字符串中的任何字母。当任何字符遇到正则表达式的搜索时将被停止,并返回。

多种模式

下面的例子演示了如何搜索多个模式。这是任意字符后跟任何字母的任何字的母模式例子。

#!/usr/bin/tclsh

regexp {([A-Z,a-z]).([A-Z,a-z])} “Tcl Tutorial” a b c puts “FullMatch: $a” puts “Sub Match1: $b” puts “Sub Match2: $c”

当执行上面的代码,产生以下结果:

Full Match: Tcl Tutorial Sub Match1: Tcl Sub Match2: Tutorial

上面的代码修改版本,以表明一个子模式可以包含多个模式如下所示。

regexp {([A-Z,a-z].([A-Z,a-z]))} “Tcl Tutorial” a b c puts “FullMatch: $a” puts “Sub Match1: $b” puts “Sub Match2: $c”

当执行上面的代码,产生以下结果:

Full Match: Tcl Tutorial Sub Match1: Tcl Tutorial Sub Match2: Tutorial

在这里插入图片描述

简单示例 set multiline a\nAb\nc regexp a.*b $multiline matched puts $matched regexp -expand# 简单示例 ```python set multiline a\nAb\nc regexp a.*b $multiline matched puts $matched regexp -expanded "a .*b" $multiline matched puts $matched regexp a.* $multiline matched puts $matched regexp -line a.* $multiline matched puts $matched regexp -line -nocase a.* $multiline matched puts $matched regexp -line -all -nocase a.* $multiline matched puts $matched regexp -line -all -nocase a.*b$ $multiline matched puts $matched regexp -start 1 -line -nocase -inline a.* $multiline regexp -- -a.* $multiline regexp -inline -- -a.* -abcde

在上面的例子中,特意用[AZ,az]所有字母,可以使用-nocase代替,如下图所示。

regexp -nocase {([A-Z].([A-Z]))} “Tcl Tutorial” a b c puts “FullMatch: $a” puts “Sub Match1: $b” puts “Sub Match2: $c”

当执行上面的代码,产生以下结果:

Full Match: Tcl Tutorial Sub Match1: Tcl Tutorial Sub Match2: Tutorial

使用选择的另一个例子如下所示。

regexp -nocase -line -- {([A-Z]*.([A-Z]*))} "Tcl \nTutorial" a b puts "Full Match: $a" puts "Sub Match1: $b" regexp -nocase -start 4 -line -- {([A-Z]*.([A-Z]*))} "Tcl \nTutorial" a b puts "Full Match: $a" puts "Sub Match1: $b"

当执行上面的代码,产生以下结果:

Full Match: Tcl Sub Match1: Tcl Full Match: Tutorial Sub Match1: Tutorial 选择正则表达式的命令 量化修饰符

使用{}的修饰符,其中m和n是无符号十进制整数,允许发范围是[0,255]。 在这里插入图片描述

原子

原子是Tcl正则表达式中相对独立的部分,re代表任何正则表达式。 在这里插入图片描述

约束

当约束满足特定条件时,匹配空字符串。约束后面不能有量化修饰符。在特定条件下约束匹配空字符串,re代表任何不以“\”结尾的正则表达式。 在这里插入图片描述

括号表达式

括号表达式是包含在“[]”中的字符列表。通常匹配列表中的任何单个字符。如果以“^”开头,则匹配不在列表中的字符。如果列表中的两个字符用“-”分隔,表示两个字符及其之间的全部字符。Tcl中的范围总是使用Unicode排序序列,但是其他程序可能使用其他排序序列,这可能是程序之间不兼容的原因之一。

字符分类

在括号表达式中,字符分类用“[:”和“:]”包围起来,表示所有属于该分类的字符。字符分类不能做为范围的端点。支持的字符分类如下: 在这里插入图片描述

约束

仅ARE,括号表达式有两种特殊情况,表示一种约束:“[[::]]”,分别匹配单词开头和结尾的空字符串。单词的定义为前后都没有单词字符的序列。而单词字符是指字母和数字以及连字符“_”。

转义

仅ARE,以“\”开头,后面跟着字母、数字。转义有几种类型:字符条目、分类简写、约束转义以及反向引用。

字符条目

在这里插入图片描述

分类简写

在这里插入图片描述

约束转义

在这里插入图片描述

反向引用

反向引用匹配由数字指定的可捕获号表达式匹配的相同的字符串。子表达式必须在反向引用之前,按括号的顺序编号。非捕获括号不进行计算。由于八进制转义与反向引用转义可能存在歧义,所以前导零总是表示八进制转义,一个单独的非零数字表示反向引用。如果在适当(数字在反向引用范围内)的可捕获表达式之后出现非零开头的多位数字,则将其视为反向引用,否则表示八进制转义。 在这里插入图片描述

元语法

通常,正则表达式使用的风格是由应用程序的方法指定的。如果任何风格的表达式以“:”开头,则剩余的表达式为ARE。如果任何风格的表达式以“=”开头,则其余的表达式被认为是一个文字字符串,将所有字符视为普通字符。如果应用程序将输入的字符串视为文本字符或者字符串以“***=”开头,则以下的嵌入式选项和注释都不可使用。

嵌入式选项

ARE表达式可能会以嵌入式选项开头,嵌入式选项会影响其后的正则表达式re,嵌入式选项只能出现在表达式之前,嵌入式选项的格式如下:

(?xyz)

xyz为一或多个选项字母,可用的选项字母如下: 在这里插入图片描述

注释

正则表达式语法除了常见的严格语法,还可以通过-expanded开关或者ARE中指定嵌入式选项x来开启另一种语法,扩展语法。在使用扩展语法时,对于复杂的正则表达式可以进行注释。注释的格式如下:

(?#ttt)

其中ttt为任意不包含“)”的文本,会被完全忽略。在方括号以及多字符符号(如ARE中的“(?:”)中不可以有注释。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3